// apply手动指定fn函数中的this
// window.name = '张三'


// fun.call(thisArg, arg1, arg2, ...)
/**
 * fn.call(thisarg,10,20,30)
每一个函数都是Function的实例。Function.prototype里面有call,apply,bind方法。
fn.call（）通过原型链是在执行原型call方法 
当call方法执行内部处理一些事情
1首先把fn函数中的内置参数this作为call方法的第一个实参值 把call函数中的this改为接收到的第一个参数对象
2.获取到传给call方法的第二个及后面的实参
3.第二个及后面传递进来的实参，传给fn函数并且执行fn函数

 */

let fn = function () {
    console.log(this.name)
}
Function.prototype.mycall=function(thisarg,...params){
  
    // console.log(thisarg,params) //{ name: 'OO' } [ 10, 20, 30 ]
    // call函数也有this，this默认指代fn 因为fn.call()，但是人为把call中this修改为thisarg

    
    // 把fn执行，把params分别传递给fn this(parmas)=fn(params)
}
fn.mycall()
console.log('---------------------------')


let sum=function(a,b){
    console.log(this) //this=>opt{ n: 20 }
    console.log(a,b) //20 30
}
let opt={n:20}
sum.call(opt,20,30) //call执行把sum中的this指向opt,并且把20 30传给sum让sum执行
// call()执行，call中的this是sum函数
